#ifndef __STORAGE_H__
#define __STORAGE_H__

#include<stdio.h>
#include <unistd.h>
#include<pthread.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<errno.h>
#include<string.h>
#include<sqlite3.h>
#include<sys/wait.h>
#include<signal.h>
#include<time.h>
#include<sys/stat.h>
#include<sys/select.h>
#include<termios.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>

#define STORAGE_SQL "storage.db"//数据库
#define GOODS_NUM 3 //仓库数量
#define STORAGE_NUM 3 // 仓库编号
#define QUEUE_MSG_LEN sizeof(struct sendEnv) //消息队列正文大小

sqlite3 *db; 
int DEVICE_M0,DEVICE_LED,DEVICE_BEEP;//设备文件描述符

//链表结构体
typedef struct node{
	/* data */
	struct node* next;
	int acfd;  
	int count;
	char status; //0表示开始接收。1表示接受数据包主体，并处理数据。
	int buf_pos;//当前数据的下标
	char rbuf[4096];
	int lenth;//数据包主体的长度
}LinkNode;

//通信环境结构体-> 24byte
struct sendEnv{
	uint8_t head[3];	 //标识位st:
	uint8_t type;		 //数据类型
	uint8_t snum;		 //仓库编号
	uint8_t temp[2];	 //温度
	uint8_t hum[2];		 //湿度
	uint8_t x;			 //三轴信息
	uint8_t y;			 
	uint8_t z;			 
	uint32_t ill;		 //光照
	uint32_t bet;		 //电池电量
	uint32_t adc; 		 //电位器信息
};

//通信RFID商品识别结构体-> 8byte
struct sendGoods{
	uint8_t head[3];	 //标识位st:
	uint8_t	type;		 //数据类型
	uint8_t snum;		 //仓库编号
	uint8_t io;			 //进出仓库
	uint8_t goodsno;	 //商品编号
	uint8_t goodsnum;	 //商品数量
};

//仓库货物信息结构体
struct storage_goods_info{
	unsigned char goods_type;	//货物类型，用数字表示
	unsigned int  goods_count;	//货物数量
};

//某个仓库的全部信息
struct storage_info{
	unsigned char storage_status;       //仓库状态
	unsigned char led_status;			//灯的状态
	unsigned char buzzer_status;		//蜂鸣器状态
	unsigned char fan_status;			//风扇状态
	unsigned char seg_status;			//数码管状态
	signed char x;						//三轴信息
	signed char y;
	signed char z;
	float temperature;					//温度信息
	float temperatureMIN;				//最小温度
	float temperatureMAX;				//最大温度
	float humidity;						//湿度信息
	float humidityMIN;					//最小湿度
	float humidityMAX;					//最大湿度
	float illumination;					//光照强度
	float illuminationMIN;				//最小光照
	float illuminationMAX;				//最大光照
	float battery;						//电池电量
	float adc;							//电位器信息
	struct storage_goods_info goods_info[GOODS_NUM];//仓库货物信息
};


//所有仓库的信息结构体
struct env_info_clien_addr{
	struct storage_info storage_no[STORAGE_NUM]; 	//仓库编号	
};


//消息队列结构体
typedef struct{
	long type;//从消息队列接收消息时用于判断的消息类型
	int cmdtype; //控制M0或者A53的指令  0:M0 1:A53
	unsigned char text[QUEUE_MSG_LEN]; //消息正文
}MSG_QUEUE;


int create_node(LinkNode** node); //创建节点
int insert_head_node(LinkNode*base,int newfd); //插入节点
int search_node(LinkNode* base,int newfd,LinkNode** fd_node);//查找所在的节点
int delete_node(LinkNode* base,int newfd);//删除节点
#endif
